/**
 *\file liste.h
 *\author Raphaël Diana
 *\author Imad Smaani
 */
#ifndef LISTE_H_INCLUDED
#define LISTE_H_INCLUDED

#include "carte.h"

/**\struct Cellule liste.h*/
typedef struct sCellule
{
    Carte * info;
    struct sCellule* suivant;
} Cellule;

/**\struct Liste liste.h*/
typedef struct sListe
{
    Cellule* ad;
} Liste;

/* Gestion Memoire */

/** \brief Crée une Liste vide.
 *
 * \param aucun
 * \return pointeur sur Liste
 *
 */

Liste * initListe();

/** \brief Détruit la structure Liste.
 *
 * \param double pointeur sur Liste
 * \return vide
 *
 */

void testamentListe(Liste **);
/* FIN Gestion Memoire */

/* Insertion & Supression & Retrait */

/** \brief Insère un élément à la fin d'une Liste.
 *
 * \param pointeur sur Liste
 * \param pointeur sur Carte
 * \return vide
 *
 */
void insertElement(Liste *,Carte *);

/** \brief Supprime le dernier élément d'une Liste.
 *
 * \param pointeur sur Liste
 * \return vide
 *
 */
void supprElement(Liste *);

/** \brief Retire et renvoie le premier élément d'une Liste.
 *
 * \param pointeur sur Liste
 * \return pointeur sur Carte
 *
 */
Carte * retireEnTete(Liste *);
/* FIN Insertion & Supression & Retrait */

/* Affichage */

/** \brief Affiche une Liste
 *
 * \param pointeur sur Liste
 * \return vide
 *
 */
void afficheListe(const Liste *);
/* FIN Affichage */

/* ACCES*/

/** \brief Retourne l'adresse de la Cellule d'indice passé en paramètre.
 *
 * \param pointeur sur Liste
 * \param entier
 * \return pointeur sur Cellule
 *
 */
Cellule * iemeCellule (const Liste *,int);

/** \brief Retourne le contenu d'une Cellule
 *
 * \param pointeur sur Liste
 * \param entier
 * \return pointeur sur Carte
 *
 */

Carte *getInfo(const Liste *,int);

/** \brief Retourne le nombre d'élément d'une Liste
 *
 * \param pointeur sur Liste
 * \return entier-non signé
 *
 */
unsigned int getNombreElement(const Liste*);
/* FIN ACCES*/

/*----Utilisation de la structure liste pour les mains----*/
/*Le mot main sera parfois remplacé par sa traduction anglaise hand
pour éviter les conflits avec le mot clé main(programme principal)*/
/** \brief Test si on peux proposer la séparation.
 *
 * \param pointeur sur Liste
 * \return booléen
 *
 */

int testSeparerListe(const Liste*);

/** \brief Sépare une main en deux.
 *
 * \param pointeur sur Liste
 * \return pointeur sur Liste
 *
 */

Liste* separeListe(Liste*);

/** \brief Retourne le nombre de carte d'une main.
 *
 * \param pointeur sur Liste
 * \return entier
 *
 */

unsigned int testNombreCarte(const Liste*);

/** \brief Calcul la valeur d'une main.
 *
 * \param pointeur sur Liste
 * \return entier non signé
 *
 */

unsigned int valeurMain(const Liste*);

/** \brief Accesseur pour la valeur d'une main.
 * Utilise la fonction valeurMain.
 * \param pointeur sur Liste
 * \return entier non signé
 *
 */

unsigned int getValeurMain(const Liste *);

/** \brief Test si un main est éligible au Blackjack.
 * Les conditions sont, deux cartes et une valeur de 21.
 * \param pointeur sur Liste
 * \return entier
 *
 */

int testBlackjack(const Liste*);

/** \brief Test si la valeur d'une main est supérieure strictement à 21.
 *
 * \param pointeur sur Liste
 * \return entier
 *
 */

int testSaute(const Liste*);


void afficheMain(const Liste * hand);


#endif

